SPDX-FileCopyrightText: 2022 Jules Halbardier & Violette Morelle SPDX-FileCopyrightText: 2024 AlICe laboratory https://alicelab.be
SPDX-License-Identifier: GPL-3.0-or-later
import bpy
import random
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.outliner.orphans_purge()def randX(mesh):
    x_mapping = {}
    for vert in mesh.vertices:
        if vert.co.z != 0:
            vert_x = vert.co.x
            if vert_x not in x_mapping:
                x_mapping[vert_x] = random.uniform(vert.co.z, vert.co.z + 0.3)
            elevation = x_mapping[vert_x]
            vert.co.z = elevationwiggles#
    for vert in mesh.vertices:
        if vert.co.z != 0:
            vert.co.x += random.randint(-1, 2) * 0.01def applyBool():Items, va donner le nom de l’object et l’object lui meme
    for key, object in bpy.data.objects.items():   On veut pas apply sur les grilles, donc si "Grid" est ds le nom on skip
            if "Grid" not in key:
            bpy.ops.object.modifier_add(type="BOOLEAN")
            bpy.context.object.modifiers["Boolean"].operation = "DIFFERENCE"
            bpy.context.object.modifiers["Boolean"].object = object
            bpy.context.object.modifiers["Boolean"].use_self = True
            bpy.ops.object.modifier_apply(modifier="Boolean")def removeTruc():
    for key, object in bpy.data.objects.items():
        if "Grid" not in key:
            object.select_set(True)
    bpy.ops.object.delete()def getGirdsHeight():
    totalHeight = 2
    trou = 0.5
    reste = totalHeight - trou
    limite = trou / 2
    first = random.uniform(0.3, reste)
    if first > limite:
        second = random.uniform(0.3, reste - first)
    else:
        second = random.uniform(limite, reste - first)
    return first, secondbpy.ops.mesh.primitive_cube_add(
    location=(0.8, random.uniform(-0.7, 0), 1), scale=(0.35, 0.07, 1.1)
)
bpy.ops.mesh.primitive_cube_add(
    location=(0.8, random.uniform(0, 0.9), 1), scale=(0.35, 0.07, 1.1)
)
bpy.ops.mesh.primitive_cube_add(
    location=(0.8, random.uniform(0, 0.9), 1), scale=(0.35, 0.07, 1.1)
)cylinders# get vertices
bpy.ops.mesh.primitive_cylinder_add(
    radius=0.1,
    depth=2,
    location=(random.uniform(-0.8, 0.8), random.uniform(-0.8, 0.8), 1),
    scale=(1, 1, 1.1),
)
bpy.ops.mesh.primitive_cylinder_add(
    radius=0.1,
    depth=2,
    location=(random.uniform(-0.8, 0.8), random.uniform(-0.8, 0.8), 1),
    scale=(2, 2, 1.1),
)
bpy.ops.mesh.primitive_cylinder_add(
    radius=0.1,
    depth=2,
    location=(random.uniform(-0.8, 0.8), random.uniform(-0.8, 0.8), 1),
    scale=(1.5, 1.5, 1.1),
)
firstHeight, secondHeight = getGirdsHeight()sort vertices
object = bpy.data.objects["Cylinder"]
vertices = list(object.data.vertices)stacked_vertices = {}
for vert in vertices:vert.co.z = abs(vert.co.z) select vertices per level
    z = round(vert.co.z, 2)
    if z not in stacked_vertices.keys():
        stacked_vertices[z] = [vert]
    else:
        stacked_vertices[z].append(vert)for level in stacked_vertices.values():for each z value vertices
    bpy.ops.object.mode_set(mode="OBJECT")
    obj = bpy.context.active_object
    bpy.ops.object.mode_set(mode="EDIT")
    bpy.ops.mesh.select_mode(type="VERT")
    bpy.ops.mesh.select_all(action="DESELECT")
    bpy.ops.object.mode_set(mode="OBJECT")
    for vert in level:
        vert.select = True
    bpy.ops.object.mode_set(mode="EDIT")change scale of selected vertices
    s = random.uniform(0.15, 2.5)
    bpy.ops.transform.resize(value=(s, s, s))end
    bpy.ops.mesh.select_all(action="DESELECT")
    bpy.ops.object.editmode_toggle()bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=70, y_subdivisions=30, size=2, location=(0, 0, 0), scale=(1, 1, 1)
)bpy.ops.object.editmode_toggle()
bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value": (0, 0, firstHeight)})
bpy.ops.object.editmode_toggle()obj = bpy.data.objects["Grid"]
mesh = obj.data
randX(mesh)Applique les boolean a la grille du dessous
applyBool()bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=70, y_subdivisions=30, size=2, location=(0, 0, 0), scale=(1, 1, 1)
)bpy.ops.object.editmode_toggle()
bpy.ops.mesh.extrude_region_move(TRANSFORM_OT_translate={"value": (0, 0, secondHeight)})
bpy.ops.object.editmode_toggle()obj = bpy.data.objects["Grid.001"]
mesh = obj.data
randX(mesh)bpy.context.object.rotation_euler[1] = 3.14159
bpy.context.object.location[2] = 2applyBool()bpy.ops.object.select_all(action="DESELECT")removeTruc()